home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Workbench Design
/
WB Collection.iso
/
workbench werkzeuge
/
bildschirmschoner
/
bserver_v1.5
/
sources.lha
/
Sources
/
lib
/
libsources
/
bitmap_chunky.s
next >
Wrap
Text File
|
1994-11-17
|
7KB
|
386 lines
include "graphics/gfx.i"
include "exec/memory.i"
section text,code
* Routine per la conversione ChunkyToPlanar per bitmaps fino a 8
* bitplanes e NON interleaved, per MC68000 e MC68020
* Copyright © 1994 by Stefano Reksten
_LVOAllocMem EQU -198
_LVOFreeMem EQU -210
* d0: colore
* d1: coord x
* d2: coord y
* a2: *bitmap
* a3: *table
xdef _ChunkyToPlanar
_ChunkyToPlanar:
* salviamo d3 e d4 che useremo nella funzione.
movem.l d0-d5,-(sp)
* come prima cosa trasformiamo le coordinate x-y in:
* bytes dall'inizio (d2), posizione bit (d1) (d3 scratch)
and.l #$FFFF,d2
asl #2,d2
move.l (a3,d2),d2
and.l #$FFFF,d1
move.b d1,d3
asr #3,d1
add.w d1,d2
moveq #7,d1
and.b #%00000111,d3
sub.b d3,d1
move.b #8,d4
sub.b bm_Depth(a2),d4
rol.b d4,d0
move.b #$FF,d3
bclr d1,d3
lea bm_Planes(a2),a0
lea .DispatchTable,a1
moveq #0,d5
move.b bm_Depth(a2),d5
lsl #2,d5
move.l 0(a1,d5.w),a1
jmp (a1)
.DispatchTable:
dc.l .NoPlanes,.Pl0,.Pl1,.Pl2,.Pl3,.Pl4,.Pl5,.Pl6,.Pl7
.Pl7:
rol.b #1,d0
move.b d0,d4
and #%00000001,d4
asl d1,d4
movea.l 28(a0),a1
adda.l d2,a1
and.b d3,(a1)
or.b d4,(a1)
.Pl6:
rol.b #1,d0
move.b d0,d4
and #%00000001,d4
asl d1,d4
movea.l 24(a0),a1
adda.l d2,a1
and.b d3,(a1)
or.b d4,(a1)
.Pl5:
rol.b #1,d0
move.b d0,d4
and #%00000001,d4
asl d1,d4
movea.l 20(a0),a1
adda.l d2,a1
and.b d3,(a1)
or.b d4,(a1)
.Pl4:
rol.b #1,d0
move.b d0,d4
and #%00000001,d4
asl d1,d4
movea.l 16(a0),a1
adda.l d2,a1
and.b d3,(a1)
or.b d4,(a1)
.Pl3:
rol.b #1,d0
move.b d0,d4
and #%00000001,d4
asl d1,d4
movea.l 12(a0),a1
adda.l d2,a1
and.b d3,(a1)
or.b d4,(a1)
.Pl2:
rol.b #1,d0
move.b d0,d4
and #%00000001,d4
asl d1,d4
movea.l 8(a0),a1
adda.l d2,a1
and.b d3,(a1)
or.b d4,(a1)
.Pl1:
rol.b #1,d0
move.b d0,d4
and #%00000001,d4
asl d1,d4
movea.l 4(a0),a1
adda.l d2,a1
and.b d3,(a1)
or.b d4,(a1)
.Pl0:
rol.b #1,d0
move.b d0,d4
and #%00000001,d4
asl d1,d4
movea.l (a0),a1
adda.l d2,a1
and.b d3,(a1)
or.b d4,(a1)
.NoPlanes:
* fine, recuperiamo i registri e torniamo.
movem.l (sp)+,d0-d5
rts
xdef _ChunkyToPlanar68020
_ChunkyToPlanar68020:
* salviamo d3 e d4 che useremo nella funzione.
movem.l d0-d5,-(sp)
* come prima cosa trasformiamo le coordinate x-y in:
* bytes dall'inizio (d2), posizione bit (d1) (d3 scratch)
move.l (a3,d2*4),d2
move.b d1,d3
asr #3,d1
add.l d1,d2
move.b d3,d1
and.b #%00000111,d1
move.b #8,d4
sub.b bm_Depth(a2),d4
rol.b d4,d0
move.b #$FF,d3
bclr d1,d3
* mettiamo l'indirizzo dell'array dei PLANEPTR in a0
lea bm_Planes(a2),a0
lea .DispatchTable_020,a1
moveq #0,d5
move.b bm_Depth(a2),d5
move.l 0(a1,d5.w*4),a1
jmp (a1)
.DispatchTable_020:
dc.l .NoPlanes_020,.Pl0_020,.Pl1_020,.Pl2_020,.Pl3_020,.Pl4_020,.Pl5_020,.Pl6_020,.Pl7_020
.Pl7_020:
rol.b #1,d0
bfins d0,([28,a0],d2.l),{d1:1}
.Pl6_020:
rol.b #1,d0
bfins d0,([24,a0],d2.l),{d1:1}
.Pl5_020:
rol.b #1,d0
bfins d0,([20,a0],d2.l),{d1:1}
.Pl4_020:
rol.b #1,d0
bfins d0,([16,a0],d2.l),{d1:1}
.Pl3_020:
rol.b #1,d0
bfins d0,([12,a0],d2.l),{d1:1}
.Pl2_020:
rol.b #1,d0
bfins d0,([8,a0],d2.l),{d1:1}
.Pl1_020:
rol.b #1,d0
bfins d0,([4,a0],d2.l),{d1:1}
.Pl0_020:
rol.b #1,d0
bfins d0,([0,a0],d2.l),{d1:1}
.NoPlanes_020:
* fine, recuperiamo i registri e torniamo.
movem.l (sp)+,d0-d5
rts
* Funzioni per creare e rilasciare la tabella di offset che serve
* per sveltire le ChunkyToPlanar.
xdef _CreateCTPTable
xdef _FreeCTPTable
* a2: *bitmap
_CreateCTPTable:
movem.l d2-d3/a6,-(sp)
moveq #0,d0
move.w bm_Rows(a2),d0
asl #2,d0 ; prepara d0 e
moveq #0,d1 ; d1 per AllocMem
move.l $4,a6
jsr _LVOAllocMem(a6)
tst d0
beq .notable
move.l d0,d3 ; salva d0 (d3 scratch)
move.l d0,a0 ; a0 = &table
moveq #0,d0
move.w bm_Rows(a2),d0
subq #1,d0 ; prepara d0 per il ciclo
moveq #0,d1
moveq #0,d2
move.w bm_BytesPerRow(a2),d2
.crtloop
move.l d1,(a0)+
add.l d2,d1
dbra d0,.crtloop
move.l d3,d0 ; ripristina d0
.notable
movem.l (sp)+,d2-d3/a6
rts
* a1: *table
* a2: *bitmap
_FreeCTPTable:
move.l a6,-(sp)
moveq #0,d0
move.w bm_Rows(a2),d0
asl #2,d0
move.l $4,a6
jsr _LVOFreeMem(a6)
move.l (sp)+,a6
rts
* ChunkyToPlanarArray (solo per 68020 per ora)
* d1: coord x
* d2: coord y
* d3: larghezza array
* d4: altezza array
* d5: bytesperrow dell'array
* a2: *bitmap solo lettura
* a3: *table solo lettura
* a4: array di colori modifica
xdef _ChunkyToPlanarArray68020
_ChunkyToPlanarArray68020:
* salviamo i registri che useremo nella funzione.
movem.l d0-d7/a4-a6,-(sp)
moveq #0,d0
* come prima cosa trasformiamo le coordinate x-y in:
* bytes dall'inizio (d2), posizione bit (d1) (d6 scratch)
move.l (a3,d2*4),d2
move.b d1,d6
asr #3,d1
add.l d1,d2
move.b d6,d1
and.b #%00000111,d1
* mettiamo l'indirizzo dell'array dei PLANEPTR in a0
lea bm_Planes(a2),a0
* facciamo 2 cicli: quello della larghezza interno, quello dell'altezza
* esterno. Per i contatori usiamo (ma guarda un po') proprio d3, d4
and.l #$0000FFFF,d5
sub d3,d5 ; d5 = numero di colori per riga da saltare
subq #1,d3
subq #1,d4
move.w d3,d7 ; memorizziamo la larghezza dell'array
; da disegnare ( != larghezza totale )
lea .DispatchTableA_020,a1
moveq #0,d6
move.b bm_Depth(a2),d6
move.l 0(a1,d6.w*4),a1 ; a1 = indirizzo della routine
; di disegno
move.b #8,d6
sub.b bm_Depth(a2),d6 ; numero di rol da fare sul colore
; anche se d6 era scratch non viene
; piu' usato.
.RowsCycle_020:
move.l d2,a5 ; memorizziamo la posiz byte
move.l d1,a6 ; e la posiz bit iniziale
.ColsCycle_020:
move.b (a4)+,d0 ; d0 = colore corrente
rol.b d6,d0
jmp (a1) ; disegna il colore
.Pl7A_020:
rol.b #1,d0
bfins d0,([28,a0],d2.l),{d1:1}
.Pl6A_020:
rol.b #1,d0
bfins d0,([24,a0],d2.l),{d1:1}
.Pl5A_020:
rol.b #1,d0
bfins d0,([20,a0],d2.l),{d1:1}
.Pl4A_020:
rol.b #1,d0
bfins d0,([16,a0],d2.l),{d1:1}
.Pl3A_020:
rol.b #1,d0
bfins d0,([12,a0],d2.l),{d1:1}
.Pl2A_020:
rol.b #1,d0
bfins d0,([8,a0],d2.l),{d1:1}
.Pl1A_020:
rol.b #1,d0
bfins d0,([4,a0],d2.l),{d1:1}
.Pl0A_020:
rol.b #1,d0
bfins d0,([0,a0],d2.l),{d1:1}
.NoPlanesA_020:
* fine, recuperiamo i registri e torniamo.
addq #1,d1 ; nuova coordinata x in posizione del bit
and.b #%00000111,d1
bne.b .GoOn_020
addq #1,d2
.GoOn_020
dbra.w d3,.ColsCycle_020
move.w d7,d3 ; recupero contatore del ciclo
adda.l d5,a4 ; skip dei colori
move.l a5,d2 ; recupero bits dall'inizio
move.l a6,d1 ; recupero bytes dall'inizio
add.w bm_BytesPerRow(a2),d2 ; prossima riga
dbra.w d4,.RowsCycle_020
movem.l (sp)+,d0-d7/a4-a6
rts
.DispatchTableA_020
dc.l .NoPlanesA_020,.Pl0A_020,.Pl1A_020,.Pl2A_020
dc.l .Pl3A_020,.Pl4A_020,.Pl5A_020,.Pl6A_020,.Pl7A_020
end